Feign客户端Fallback全局代理

您所在的位置:网站首页 feign 统一 fallback Feign客户端Fallback全局代理

Feign客户端Fallback全局代理

2023-08-18 20:34| 来源: 网络整理| 查看: 265

/** FeignContext wrapper */static class TargetFeignContextWrapper extends FeignContext {

private final FeignContext delegate; private final ConfigurableListableBeanFactory beanFactory; /** HystrixTargeter */ private static Class ClassHystrixTargeter; /** 默认Target */ private static Class ClassDefaultTargeter;

static { try { // package-access class load ClassHystrixTargeter = TargetFeignContextWrapper.class.getClassLoader().loadClass("org.springframework.cloud.openfeign.HystrixTargeter"); ClassDefaultTargeter = TargetFeignContextWrapper.class.getClassLoader().loadClass("org.springframework.cloud.openfeign.DefaultTargeter"); } catch (ClassNotFoundException e) { log.warn("Unable to load HystrixTargeter.", e); } }

public TargetFeignContextWrapper(FeignContext delegate, ConfigurableListableBeanFactory beanFactory) { this.delegate = delegate; this.beanFactory = beanFactory; }

@Override public T getInstance(String name, Class type) { // 目标对象 T object = this.delegate.getInstance(name, type); // 必要进行包装代理 return warpIfNecessary(object); }

@Override public Map getInstances(String name, Class type) { Map instances = this.delegate.getInstances(name, type); if (instances == null) { return null; } // 保持原始Bean顺序(链路追踪Sleuth代理的FeignContext返回HashMap,导致bean即使声明了ordered依旧无须,因此在使用该框架时注意) Map convertedInstances = new LinkedHashMap(); for (Map.Entry entry : instances.entrySet()) { convertedInstances.put(entry.getKey(), warpIfNecessary(entry.getValue())); } // 自定义排序 return sortByOrdered(convertedInstances); }

/** 针对需要的Bean进行包装代理 */ private T warpIfNecessary(T object) { if (object != null) { if ((ClassHystrixTargeter != null && ClassHystrixTargeter.isAssignableFrom(object.getClass())) || (ClassDefaultTargeter != null && ClassDefaultTargeter.isAssignableFrom(object.getClass()))) { // 如果是 Targeter, 进行AOP代理 return (T)enhancement(object); } } return object; }

/** 对BeanMap进行排序 */ private Map sortByOrdered(Map beans) { if (beans != null && !beans.isEmpty()) { List sortList = new ArrayList(beans.entrySet()); //noinspection rawtypes sortList.sort(new Comparator() { private final Comparator orderComparator = new OrderComparator();

@SuppressWarnings("unchecked") @Override public int compare(Map.Entry o1, Map.Entry o2) { Object bean1 = null; Object bean2 = null; if (o1 != null) { bean1 = o1.getValue(); } if (o2 != null) { bean2 = o2.getValue(); } return orderComparator.compare(bean1, bean2); } }); Map result = new LinkedHashMap(); sortList.forEach(entry -> result.put(entry.getKey(), entry.getValue())); return result; } return beans; }

/** 对 HystrixTargeter 执行增强代理 */ private Object enhancement(Object target) { Object proxy = enhancementCache.get(target); if (proxy == null) { synchronized (this) { proxy = enhancementCache.get(target); if (proxy == null) { Map feignHystrixContextRegisterBeans = beanFactory.getBeansOfType(FeignHystrixContextRegister.class); Enhancer enhancer = new Enhancer(); // 增强HystrixTargeter enhancer.setSuperclass(target.getClass()); enhancer.setCallback((MethodInterceptor) (contextThis, method, args, methodProxy) -> { if (method.getName().equals("target")) { // args = FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context, Target.HardCodedTarget target Feign.Builder feign = (Feign.Builder) args[1]; if (feign != null) { // 可选,对Feign请求拦截器进行排序(有需求的可以使用反射进行操作) HystrixFeignHelper.sortRequestInterceptors(feign); } if (feign instanceof HystrixFeign.Builder) { // 代理方法执行 return new HystrixFeignHelper((HystrixFeign.Builder)feign, feignHystrixContextRegisterBeans.values()) .target(args[0], (HystrixFeign.Builder)args[1], (FeignContext)args[2], (Target.HardCodedTarget)args[3]); } } return methodProxy.invoke(target, args); }); proxy = enhancer.create(); enhancementCache.put(target, proxy); } } } return proxy; }

// AOP缓存 private final Map enhancementCache = new ConcurrentHashMap();}



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3